package com.huajin.codetest.base;

/**
 * 进制参考
 * https://zhuanlan.zhihu.com/p/159127499
 * https://blog.csdn.net/weixin_44540543/article/details/108356180
 * 
 * hashcode
 * https://www.cnblogs.com/grey-wolf/p/13069173.html
 * 
 * @author hongwei.lian
 * @date 2023年7月5日 上午10:43:27
 */
public class OperatorTest {
	
//	public static void main(String[] args) { 
//		int a = 15;
//		int b = -15;
//		
//		//-- >> 按位有符号右移
//		
//		System.out.println("====正整数按位有符号右移开始====");
//		//-- 十进制  15 
//		//-- 原码     00000000 00000000 00000000 00001111
//		//-- 补码     00000000 00000000 00000000 00001111
//		//-- >>       00000000 00000000 00000000 00000011
//		//-- 验证     Integer.parseUnsignedInt("00000000000000000000000000000011", 2)
//		//-- 原码      00000000 00000000 00000000 00000011
//		//-- 验证      2^1+2^0
//		//-- 十进制  3
//		System.out.println(a >> 2);//-- 3
//		System.out.println(Integer.parseUnsignedInt("00000000000000000000000000000011", 2));//-- 3
//		System.out.println(Integer.toBinaryString(3));//-- 11
//		System.out.println("====正整数按位有符号右移结束====");
//		
//		System.out.println("====负整数按位有符号右移开始====");
//		//-- 十进制  -15 
//		//-- 原码     10000000 00000000 00000000 00001111
//		//-- 补码     11111111 11111111 11111111 11110001
//		//-- >>       11111111 11111111 11111111 11111100
//		//-- 验证     Integer.parseUnsignedInt("11111111111111111111111111111100", 2)
//		//-- 原码     10000000 00000000 00000000 00000100
//		//-- 验证      -2^2
//		//-- 十进制  -4
//		System.out.println(b >> 2);//-- -4
//		System.out.println(Integer.parseUnsignedInt("11111111111111111111111111111100", 2));//-- -4
//		System.out.println(Integer.toBinaryString(-4));//-- 11111111111111111111111111111100
//		System.out.println("====负整数按位有符号右移结束====");
//		
//		//-- >>> 按位无符号右移
//		
//		System.out.println("====正整数按位无符号右移开始====");
//		//-- 十进制  15 
//		//-- 原码     00000000 00000000 00000000 00001111
//		//-- 补码     00000000 00000000 00000000 00001111
//		//-- >>>    00000000 00000000 00000000 00000011
//		//-- 验证     Integer.parseUnsignedInt("00000000000000000000000000000011", 2)
//		//-- 原码      00000000 00000000 00000000 00000011
//		//-- 验证      2^1+2^0
//		//-- 十进制  3
//		System.out.println(a >>> 2);//-- 3
//		System.out.println(Integer.parseUnsignedInt("00000000000000000000000000000011", 2));//-- 3
//		System.out.println(Integer.toBinaryString(3));//-- 11
//		System.out.println("====正整数按位无符号右移结束====");
//		
//		System.out.println("====负整数按位无符号右移开始====");
//		//-- 十进制  -15 
//		//-- 原码      10000000 00000000 00000000 00001111
//		//-- 补码      11111111 11111111 11111111 11110001
//		//-- >>>     00111111 11111111 11111111 11111100
//		//-- 验证      Integer.parseUnsignedInt("00111111111111111111111111111100", 2)
//		//-- 原码      00111111 11111111 11111111 11111100
//		//-- 验证      2^30-2^2
//		//-- 十进制  1073741820
//		System.out.println(b >>> 2);//-- 1073741820
//		System.out.println(Integer.parseUnsignedInt("00111111111111111111111111111100", 2));//-- 1073741820
//		System.out.println(Integer.toBinaryString(1073741820));//-- 111111111111111111111111111100
//		System.out.println("====负整数按位无符号右移结束====");
//		
//		
//		
//		
//	
//	}
//	
//	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
//	public static void main(String[] args) {
//		//-- 无符号右移
//		//-- >>> 按位右移补零操作符：
//		int a = 15;//-- 0000 1111
//		int b = a >>> 2;//--  0000 0011
//		System.out.println(b);
//		//-- ^ 异或运算符：如果相对应位值相同，则结果为0，否则为1
//		int c = a ^ b;
//		//-- 0000 1111
//		//-- 0000 0011
//		//-- 0000 1100     0+0+4+8 12
//		System.out.println(c);
//		//-- & 按位与运算符：如果相对应位值都是1，则结果为1，否则为0
//		int d = c & 0x7fffffff;
//		//-- 0000 1100
//		//-- 1111 1111
//		//-- 0000 1100 0+0+4+8 12
//		System.out.println(d);
//		
//		
//		//-- << 按位左移运算符 
//		//-- 相当于原数的2的移动位数倍
//		int e = a << 2;
//		//-- 0000 1111
//		//-- 0011 1100 0+0+4+8+16+32 60
//		System.out.println(e);
//		
//		//-- 带符号右移
//		//-- >> 按位右移运算符 
//		//-- 相当于原数的2的移动位数
//		int f = a >> 2;
//		//-- 0000 1111
//		//-- 0000 0011  1+2 3
//		System.out.println(f);
//		int g = -15 >> 2;
//		//-- -4
//		System.out.println(g);
//	}
	
	//-- 从右向左则是低位向高位
	//-- 一般来说，一个hashcode，一般用int来表示，32位
	public static void hex() {
		//-- 0x7fffffff   为啥要与0x7fffffff按位与运算符，需要得到正数，那ConcurrentHashMap的Node的hashCode不能是负数
		//-- 0x 7 f f f f f f f
		//-- 0111 1111 1111 1111 1111 1111 1111 1111
		
		
		//-- h = key.hashCode()
		//-- (h ^ (h >>> 16)   HashMap采用hash算法
		//-- (h ^ (h >>> 16)) & 0x7fffffff  ConcurrentHashMap采用hash算法
	}

}
